<?php

/**
 * Инкапсулирует информацию о наименовании и параметрах объекта.
 *
 */
final class Kernel_Token
{
    /**
     * Наименование объекта.
     *
     * @var string
     */
    private $_name;

    /**
     * Параметры объекта.
     *
     * @var array
     */
    private $_params = array();

    /**
     * Конструктор.
     *
     * @param   string  $name
     * @param   array   $params
     */
    public function __construct($name, $params = array())
    {
        $this->_name = $name;
        $this->_params = $params;
    }

    /**
     * Возвращает наименование объекта.
     *
     * @return  string
     */
    public function getName()
    {
        return $this->_name;
    }

    /**
     * Возвращает параметры объекта.
     *
     * @return  array
     */
    public function getParams()
    {
        return $this->_params;
    }

    /**
     * Устанавливает параметры объекта.
     *
     * @param   array   $params
     * @return  Kernel_Token
     */
    public function setParams($params)
    {
        $this->_params = array_merge($this->_params, $params);
        return $this;
    }

    /**
     * Оборачивает значение смешанного типа (строка или токен) в токен.
     *
     * @param   mixed   $input
     * @return  Kernel_Token
     */
    static public function wrap($input)
    {
        switch (true)
        {
            case $input instanceof self:
                $token = $input;
                break;

            case is_string($input):
                $params = func_num_args() > 1 ? (array)func_get_arg(1) : array();
                $token = new self($input, $params);
                break;

            default:
                $token = false;
                break;
        }

        return $token;
    }
}
